﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Model;
using Logica.WebServices_BCR;
//using Entidades;
namespace Logica
{
    public class Administrator
    {
        public void processManager()
        {

            
            //pasos del proceso
            //leer la cola (BD)
            //eliminar todos los WI q no tengan estado 4
            //procesar inconsistencias
            //procesar excepciones
            //procesar duplicados
           MailMessage mail = new MailMessage();

            Services.sendLog(544,"Reanudando Ciclo...",Services.errorType.Information_Message);

            Services.sendLog(544,"El servicio Unisys Duplicate Check ha iniciado su procesmiento", Services.errorType.Log_Message,null,"Inicio del Servicio");
            DuplicateService businessRules;
            try
            {
                businessRules = DuplicateService.loadBusinessRules();
                if (businessRules == null)
                {
                    Services.sendLog(114, "Error al cargar las reglas del negocio. Reglas de Negocio Vacias ", Services.errorType.Error_Message);
                    return;
                }
            }
            catch (Exception e)
            {
                Services.sendLog(114, "Error al cargar las reglas del negocio: "+e.Message, Services.errorType.Error_Message,e);
                return;
            }
            InfoImage_Folder.IIF_Manager infoImage = null;
            try
            {

                infoImage = new Logica.InfoImage_Folder.IIF_Manager();//referencia a IIF
            }
            catch (Exception e)
            {
                Services.sendLog(204, "Imposible conectar con IIF", Services.errorType.Error_Message, e);
                return;
            }

            BD_Administrator.BDManager dataBase = new BD_Administrator.BDManager(infoImage);//referencia a la base de datos

            SqlDataReader queueReader = null;//referencia a QUEUES

            #region Read Queue            

            try
            {
                queueReader = dataBase.queueCheck(businessRules);
                if (queueReader == null)
                {
                    Services.sendLog(155, "Imposible ejecutar query a la Base de Datos de InfoImage: Reader = Null", Services.errorType.Error_Message);
                    Services.sendLog(557, "Se detiene el proceso de validacion de duplicados", Services.errorType.Log_Message,null,"Fin del Proceso");
                    if (infoImage != null)//si se abrio una conexion con InfoImage
                    {
                        infoImage.ClearIIFClientDesktop();
                        infoImage.DestroyIIFClientExplicit();
                        Services.sendLog(572, "Seciones de IIF cerradas y escritorio limpio.", Services.errorType.Information_Message);
                    }
                    return;
                }
            }
            catch (Exception sqlExc)
            {
                Services.sendLog(155, "Imposible ejecutar query a la Base de Datos de InfoImage: "+sqlExc.Message, Services.errorType.Error_Message,sqlExc);
                Services.sendLog(557, "Se detiene el proceso de validacion de duplicados", Services.errorType.Log_Message,null,"Fin del Proceso");
                if (infoImage != null)//si se abrio una conexion con InfoImage
                {
                    infoImage.ClearIIFClientDesktop();
                    infoImage.DestroyIIFClientExplicit();
                    Services.sendLog(572, "Seciones de IIF cerradas y escritorio limpio.", Services.errorType.Information_Message);
                }
                return;
            }

            #endregion

            #region Process Documents In Queue
            
            if (queueReader.HasRows)
            {
                Services.sendLog(665, "Procesando Documentos", Services.errorType.Information_Message);
                List<duplicateDocument> duplicateDocuments = dataBase.convertReaderToList(queueReader);
                queueReader.Close();
                Services.sendLog(665, "Se encontraron "+duplicateDocuments.Count.ToString()+" documentos en la cola", Services.errorType.Information_Message);
                mail.files = duplicateDocuments.Count;
                Services.sendLog(0, "Existen "+mail.files+" pendientes de procesar", Services.errorType.Proccess_Message,null,"Documentos Pendientes",mail.files);
                
                foreach (duplicateDocument document in duplicateDocuments)
                {
                    //mail.files++;
                    int Work_Status=0;
                    try
                    {
                        Work_Status = Convert.ToInt32(document.getValue("WORK_STATUS"));
                    }
                    catch (Exception e)
                    {
                        Services.sendLog(65, "El campo WORK_STATUS del documento[" + document.getIDValue() + "] tiene valores invalidos. Valor actual: " + document.getValue("WORK_STATUS"), Services.errorType.Error_Message,e);
                        mail.documentsNoOk++;
                        continue;
                    }                   

                    switch (Work_Status)
                    {
                        #region Discard Document with Errors
                        case 2://documento bloqueado por un usuario
                            {
                                Services.sendLog(216, "El documento se encuentra bloqueado en el escritorio, imposible" +
                                    "realizar el control de duplicados. Document with ID[" + document.getIDValue() + "] is discarded", Services.errorType.Error_Message);
                                mail.documentsNoOk++;//el sistema proceso correctamente el documento
                                //continue;
                            }break;
                        case 7://documento con errores
                            {
                                Services.sendLog(216, "El documento se encuentra con errores, imposible" +
                                    "realizar el control de duplicados, el codigo de error de InfoImage es: " + document.getValue("ERROR_CODE") + ". " +
                                    "Document with ID[" + document.getIDValue() + "] is discarded", Services.errorType.Error_Message);
                                mail.documentsNoOk++;//el sistema proceso correctamente el documento
                                //continue;
                            }break;
                        #endregion

                        #region Process Available Document

                        case 4://documento disponible
                            {
                                if (dataBase.processDocument(document, businessRules))
                                    mail.documentsOk++;
                                else
                                    mail.documentsNoOk++;

                            } break;

                        #endregion
                    }
                }

                /*
                while(queueReader.Read()){
                    mail.files++;
                    switch (queueReader.GetInt32(queueReader.GetOrdinal("WORK_STATUS")))
                    {
                        #region Discard Document with Errors
                        case 2://documento bloqueado por un usuario
                            {
                                Services.sendLog(216, "El documento se encuentra bloqueado en el escritorio, imposible"+
                                    "realizar el control de duplicados. Document with ID[" + queueReader.GetString(queueReader.GetOrdinal("ID")) + "] is discarded", Services.errorType.Error_Message);
                                mail.documentsOk++;//el sistema proceso correctamente el documento
                                continue;
                            }
                        case 7://documento con errores
                            {
                                Services.sendLog(216, "El documento se encuentra con errores, imposible" +
                                    "realizar el control de duplicados, el codigo de error de InfoImage es: " + queueReader.GetInt32(queueReader.GetOrdinal("ERROR_CODE")).ToString() + ". " +
                                    "Document with ID[" + queueReader.GetString(queueReader.GetOrdinal("ID")) + "] is discarded", Services.errorType.Error_Message);
                                mail.documentsOk++;//el sistema proceso correctamente el documento
                                continue;
                            }
                        #endregion

                        #region Process Available Document

                        case 4://documento disponible
                            {
                                if (dataBase.processDocument(queueReader, businessRules))
                                    mail.documentsOk++;
                                else
                                    mail.documentsNoOk++;
                                
                            }break;

                        #endregion
                    }
                }
                //queueReader.Close();
                */
                #region sendStadistics
                Services.sendLog(0, "Se procesaron " + mail.files + " documentos que se encontraban en la cola, de ellos " + mail.documentsOk + " se procesaron correctamente y " + mail.documentsNoOk + " se procesaron incorrectamente", Services.errorType.Information_Message);
                Services.sendLog(0, "Documentos no procesados", Services.errorType.Proccess_Message, null, "Documentos Procesados No Ok", mail.documentsNoOk);
                Services.sendLog(0, "Documentos Procesados Correctamente", Services.errorType.Proccess_Message, null, "Documentos Procesados Ok", mail.documentsOk);
                try
                {
                    mail.sendMessage();
                }
                catch (Exception e)
                {
                    Services.sendLog(51, "Imposible enviar email "+e.Message, Services.errorType.Error_Message,e);
                }
                #endregion
            }
            else
                Services.sendLog(630, "No existen documentos por procesar", Services.errorType.Proccess_Message);

            #endregion

            if (infoImage != null)//si se abrio una conexion con InfoImage
            {
                infoImage.ClearIIFClientDesktop();
                infoImage.DestroyIIFClientExplicit();
                Services.sendLog(572, "Seciones de IIF cerradas y escritorio limpio.", Services.errorType.Information_Message);
            }

            
            
            Services.sendLog(557, "El servicio Unisys Duplicate Check ha entrado en modo Wait", Services.errorType.Log_Message,null,"Fin del Proceso");
        }

        
    }
}
